import jssc.SerialPort;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class SerialPortReadWriteExample {
    public static void main(String[] args) {
        SerialPort serialPort = new SerialPort("COM4");

        try {
            // 打开串口
            serialPort.openPort();

            // 设置串口参数
            serialPort.setParams(SerialPort.BAUDRATE_9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN | SerialPort.FLOWCONTROL_RTSCTS_OUT);
            // 添加串口事件监听器
            serialPort.addEventListener(new SerialPortEventListener() {
                @Override
                public void serialEvent(SerialPortEvent event) {
                    if (event.isRXCHAR()) { // 接收到字符事件
                        try {
                            // 读取数据
                            byte[] buffer = serialPort.readBytes();
                            if (buffer != null) {
                                String data = new String(buffer);
                                System.out.println("从串口读取到的数据：" + data);
                            }
                        } catch (SerialPortException e) {
                            e.printStackTrace();
                        }
                    }
                }
            },SerialPort.MASK_RXCHAR | SerialPort.MASK_ERR);

            // 创建写入线程
            Thread writeThread = new Thread(() -> {
                try {
                    for (int i = 0; i < 10; i++) {
                        // 写入数据
                        String data = "Hello, Serial Port!"+i;
                        serialPort.writeBytes(data.getBytes());
                        Thread.sleep(2000);
                        System.out.println("数据已写入串口。");
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }
            });

            // 启动写入线程
            writeThread.start();

            // 等待线程结束
            writeThread.join();
            // 关闭串口
            serialPort.closePort();
            System.out.println("串口已关闭。");

        } catch (SerialPortException | InterruptedException e) {
            e.printStackTrace();
        }
    }
}
